namespace FluentDataContract
{
    using System;
    using System.Linq.Expressions;

    // Common between Objects and Properties
    public interface IBuilder<TObject, out T>
    {
        T IncludeDefaultValues();
        T ExcludeDefaultValues();

        T IncludeNullValues();
        T ExcludeNullValues();

        [Obsolete("Use IncludeProperty instead")]
        IPropertyBuilder<TObject> Property<TProperty>(Expression<Func<TObject, TProperty>> expression);

        [Obsolete("Use IncludeProperties instead")]
        IPropertyBuilder<TObject> Properties(params Expression<Func<TObject, object>>[] expressions);

        IPropertyBuilder<TObject> IncludeProperty<TProperty>(Expression<Func<TObject, TProperty>> expression);
        IPropertyBuilder<TObject> IncludeProperties(params Expression<Func<TObject, object>>[] expressions);

        IObjectBuilder<TObject> ExcludeProperty<TProperty>(Expression<Func<TObject, TProperty>> expression);
        IObjectBuilder<TObject> ExcludeProperties(params Expression<Func<TObject, object>>[] expressions);
    }
}